package com.freemypay.test.并发.共享受限资源.线程本地存储;

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 线程本地存储
 * 演示错误，和案例不服
 * @author yesixian
 * @date 2018年6月7日
 */
public class ThreadLocalVariableHodel {
	private static ThreadLocal<Integer> value = new ThreadLocal<Integer>() {
		private Random rand = new Random(47);
		protected synchronized Integer initialValue() {
			return rand.nextInt(10000);
		}
		
	};
	
	public static void increment() {
		value.set(value.get() + 1);
	}
	
	public static int get() {
		return value.get();
	}
	
	public static void main(String[] args) throws InterruptedException {
		ExecutorService exec = Executors.newCachedThreadPool();
		for (int i = 0; i < 5; i++) {
			exec.execute(new Accessor(i));
			TimeUnit.SECONDS.sleep(3); //run for a while
			exec.shutdownNow(); 		//All accessor will quit
		}
	}
	
}

class Accessor implements Runnable {
	private final int id;
	
	public Accessor(int idn) {
		id = idn;
	}

	@Override
	public void run() {
		while(!Thread.currentThread().isInterrupted()) {
			ThreadLocalVariableHodel.increment();
			System.out.println(this);
			Thread.yield();
		}
	}

	@Override
	public String toString() {
		return "Accessor [id=" + id + "]" + ThreadLocalVariableHodel.get();
	}
	
}
